/**
 * 给定N长度数组A，每次操作如下：
 *    选择1<=i<j<k<=N的三个位置，将Aj-=2,Ai+=1,Ak+=1
 * 问最少需要几次操作可以将A[2...N-1]全变为0
 * 显然偶数很好办，关键在于奇数
 * 奇数如果一直拿出2个，显然仍然是奇数，因此必须要让奇数位置接收一变为偶数
 * 按优先级采用如下规则：
 * 1. 拿出2个奇数，保证其中一个大于1，操作一次以后可以得到一奇一偶
 * 2. 拿出一奇一偶，操作一次以后可以得到一偶或者两偶
 * 3. 没有奇数，全是偶数，可以直接计算答案
 * 注意到上述操作与左右位置其实无关，只跟数值有关
 * 为了得到大于1的奇数，用优先队列维护元素值。一个维护奇数，一个维护偶数
 * O(NlogN)。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

int N;
vi A;



llt proc(){
    priority_queue<int> ji, ou;
    for(int i=1;i<N-1;++i){
        if(A[i] & 1){
            ji.push(A[i]);
        }else{
            ou.push(A[i]);
        }
    }

    llt ans = 0;
    while(1){
        if(ji.empty()) break;

        if(ou.empty()){
            if(ji.size() == 1) return -1;
            if(ji.top() == 1) return -1;

            ans += 1;

            auto a = ji.top(); ji.pop();
            auto b = ji.top(); ji.pop();

            a -= 2;
            ji.push(a);

            b += 1;
            ou.push(b);
        }

        auto a = ou.top(); ou.pop();
        auto b = ji.top(); ji.pop();
        
        a -= 2;
        if(a) ou.push(a);
        
        b += 1;
        ou.push(b);

        ans += 1;
    }

    while(not ou.empty()){
        ans += ou.top() / 2;
        ou.pop();
    }

    return ans;
}

void work(){
    cin >> N;
    A.assign(N, {});
    for(auto & i : A) cin >> i;
    
    cout << proc() << endl;
    return;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
   
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}